package ro.pub.acs.android;

import java.util.ArrayList;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * adaptorul (controllerul) listei (paradigma MVC)
 * @author Vlad
 *
 */
public class AdaptorPersonaje extends BaseAdapter {
	
	//referinta catre activitatea care afiseaza lista
	private Activity activity;
	
	//modelul listei (paradigma MVC)
	private ArrayList<Personaj> personaje = new ArrayList<Personaj>();

	public AdaptorPersonaje(Activity activity)
	{
		this.activity = activity;
	}

	
	// functia trebuie sa intoarca view-ul de pe pozitia position din lista
	@Override
	public View getView (int position, View convertView, ViewGroup list) 
	{
		//Meanica reciclarii obiectelor grafice are loc aici.
		//Mecanismul de reciclare functioneaza in felul urmator:
		//Daca spre exemplu derulam lista in jos, in momentul in care elementul grafic cel mai de sus devine invizibil, 
		// va fi repozitionat automat jos si i se va schimba continutul.
		// Aceasta reprezinta OPTIMIZAREA 1.
		
		//OPTIMIZAREA 2 are loc in ceea ce priveste apelul findViewById, si este rezolvata printr-un fel de caching
		//(vezi mai jos)
		
		View element;

		// convertView este un element din lista ce nu mai este vizibil si poate fi refolosit
		if (convertView == null) 
			//daca nu avem un element grafic indisponibil (ascuns) care sa fie repozitionat automat la derulare,
			//atunci trebuie sa il cream de la 0.
		{
			LayoutInflater inflater = activity.getLayoutInflater();
			element = inflater.inflate(R.layout.personaj_list_element_view, null); //APEL COSTISITOR 1
			//aici cream un view nou. Ceea ce e costisitor.
			//Noroc ca linia aceasta de cod nu e apelata decat de atatea ori cate elemente grafice ale listei incap 
			// pe ecran la un moment dat (OPTIMIZAREA 1).
			
			
			TagPersonaje tagPersonaje = new TagPersonaje();
			tagPersonaje.nume = (TextView)element.findViewById(R.id.numePersonaj); //APEL COSTISITOR 2
			tagPersonaje.desen = (TextView)element.findViewById(R.id.desenAnimatPersonaj); //APEL COSTISITOR 2
			tagPersonaje.imagine = (ImageView)element.findViewById(R.id.imaginePersonaj); //APEL COSTISITOR 2
			//findviewbyid este un alt apel costisitor.
			//Analog cu layoutinflater, vom apela findViewById pentru nume, desen si imagine, de atatea ori cate elemente 
			// grafice ale listei incap  pe ecran la un moment dat (OPTIMIZAREA 2). 
			// Aceste referinte catre sub-obiectele grafice (vizuale), odata preluate cu findViewById, le memoram in
			// obiecte de tipul TagPersonaje, specifice fiecarui element grafic al listei.
			
			element.setTag(tagPersonaje); //in cadrul elementului grafic al listei, putem retine un obiect cu diverse informatii
			
		} else {
			//aici inseamna ca avem un element grafic la dispozitie (ascuns) pe care il putem refolosi 
			//(repozitionarea o va afce automat Android-ul)
			element = convertView;
		}
		
		//preluam informatiile auxiliare stocate in elementul grafic 
		TagPersonaje tagPersonaje = (TagPersonaje)element.getTag();
		
		//setam continutul efectiv pe care elementul grafic il afiseaza
		//referintele catre elementele grafice gen TextView, ImageView, le avem deja stocate de cand am creat obiectul
		// grafic specific unul element din lista (mai sus).
		tagPersonaje.nume.setText(personaje.get(position).getNumePersonaj());
		tagPersonaje.desen.setText(personaje.get(position).getDesenAnimatPersonaj());
		tagPersonaje.imagine.setImageResource(R.drawable.icon);

		return element;
	}

	@Override
	public int getCount ()
	{
		// intoarce nr de elemente din model
		return personaje.size ();
	}

	@Override
	public Object getItem(int position) 
	{
		// intoarce elementul de pe pozitia position din model
		return personaje.get(position);
	}

	@Override
	public long getItemId(int position) 
	{
		// fiecare element din lista poate avea un id customizabil de catre programator.
		// in cazul de fata, id-ul este chiar pozitia in cadrul modelului.
		return position;
	}

	//functia este apelata la apasarea pe buton si adauga automat un personaj nou in lista.
	public void adaugaPersonajRandom ()
	{
		Personaj personaj = new Personaj();
		personaj.setNumePersonaj("Bugs Bunny " + personaje.size());
		personaj.setDesenAnimatPersonaj("Looney Tunes " + personaje.size());

		personaje.add(personaj);
		this.notifyDataSetChanged();
	}

	//functia, declansata de o apasare lunga, determina stergerea personajului selectat.
	public void stergePersonaj (int position) {
		personaje.remove(position);
		this.notifyDataSetChanged();
	}
}
